#include "Gamma.h"
#include "RepresentadorEnBits.h"
#include "math.h"
#include <iostream>

Gamma::Gamma() {
}

Gamma::~Gamma() {
}

std::string Gamma::comprimir(int x, int*longitud) {
	RepresentadorEnBits r;
	int log = (int) (log2(x));
	int unario = 1 +log;
	int binario= x - (pow(2,log));
	r.set_long(unario+log);
	int i = 1;

	r.agregar_nro_dec(log, binario);
	r.agregar_cero();

	while (i < unario) {
		r.agregar_uno();
		i++;
	}
	*longitud = r.getLongitud();
	std::string s;
	r.pasar_a_bit(&s);
	return s;
}

int Gamma::descomprimir(const std::string &cadena, int* pos_actual) {
	bool salida = false;
	int cantidad_unos = 0;
	int hola = cadena.size();
	while (!salida) {
		if (cadena.at(*pos_actual) == '1') {
				cantidad_unos++;
		}
		else {
			salida = true;
		}
		(*pos_actual)++;
	}
	RepresentadorEnBits r;
	r.set_long(cantidad_unos);
	int j = 0;
	while (j < cantidad_unos) {
		if(cadena.at(*pos_actual) =='1') {
			r.agregar_uno();
		}
		else {
			r.agregar_cero();
		}
		(*pos_actual)++;
		j++;
	}

	int b = r.devolver_entero();
	int x = pow(2,cantidad_unos) + b;
	return x;
}
